sitepoint.com의 Node.js 관련 Article 번역
원문 sitepoint.com의 Making HTTP Requests in Node.js
오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)
이전의 글에서 Node.js 서버를 만드는 것에 초점을 둔것은 HTTP 요청을 처리하기 위해서였다. 이번 글은 문제를 반대로 생각해서 당신의 Node.js 애플리케이션이 HTTP 요청을 어떻게 만들어 내는지를 보여줄 것이다. 아마 왜 그렇게 해야 하는지 의문이 들지도 모른다. 문득 떠오르는 애플리케이션이 두개 있다 - web scraping과 proxying. 스크래퍼는 웹페이지를 다운로드하고 계획에 따라 그것으로부터 정보를 추출하는 소프트웨어이다. 프록시 서버는 다른 서버에게 클라이언트의 요청을 전달하고 응답을 반환해주는 중개인과 같은 역할을 한다.
Node.js에서 HTTP 요청을 만드는 가장 간단한 방법은 request
모듈을 사용하는 것이다. Mikeal Rogers가 만든 request
모듈은 GET
, POST
, PUT
, 그리고 DELETE
를 포함한 모든 유형의 HTTP 요청을 만들게 해준다. 그러한 유연성이 request
모듈을 RESTful APIs로 상호작용하기에 적합하게 만든다. 다음의 npm 명령을 사용해서 request
모듈을 설치할 수 있다.
$ npm install request
request
가 설치되었다면 아래 보이는 코드로 새로운 Node.js 파일을 만들어보자. 예제의 첫번째 라인에서 request
모듈을 프로그램 안으로 임포트하였다. HTTP 요청을 만드는 것은 간단하게 request()
함수를 호출하면 된다. 이 예제에서 우리는 sitepoint 홈페이지를 다운로드하기 위해 요청을 하고 있다. 물론, request()
의 두번째 인자는 콜백 함수이다.
var request = require("request");
request("http://www.sitepoint.com", function(error, response, body) {
console.log(body);
});
request()
의 콜백 함수는 세개의 인자를 받는다 - error
, response
, 그리고 body
. 이름을 보면 알수 있듯이 error
는 HTTP 요청 중 발생하는 모든 문제에 관한 정보를 포함하고 있다. response
인자는 호출에 대해 반환되는 상태코드, 헤더 등 많은 것들을 포함한 다양한 데이터를 가지고 있는 객체이다. 세번째 인자인 body
는 응답의 body이다. 앞의 예제에서 body
는 sitepoint 홈페이지의 소스 코드를 포함하고 있다.
request
모듈은 HTTP 요청을 파일로 그리고 파일로부터 스트림하기 위해 파일 시스템 모듈과 결합을 할수도 있다. 다음 예제도 sitepoint 홈페이지를 가져 오는 것이다. 하지만, 콘솔에 소스코드를 보여주는 대신에 “sitepoint.htm”
이라는 파일로 저장한다.
var request = require("request");
var fs = require("fs");
request("http://www.sitepoint.com").pipe(fs.createWriteStream("sitepoint.htm"));
앞의 예제들은 URL에 대해 간단한 GET
요청을 만들고 있다. 하지만 우리는 request()
의 첫번째 인자로 설정 객체를 전달함으로써 HTTP 요청을 수정할 수 있다. 아래 예제 역시 sitepoint 홈페이지를 다운로드하는 것이지만 더 강력한 구문을 사용하고 있다. 숫자형의 설정 파라미터에 주의해야 하며 uri
와 method
파라미터는 sitepoint에 GET
요청을 보내라고 request
에게 알려준다.
var request = require("request");
request({
uri: "http://www.sitepoint.com",
method: "GET",
timeout: 10000,
followRedirect: true,
maxRedirects: 10
}, function(error, response, body) {
console.log(body);
});
timeout
파라미터는 응답을 포기하기전에 10,000 밀리초(10초)동안 기다리라고 request
에게 알려주는 것이며, 마지막 두개의 파라미터는 리다이렉션 처리를 해준다. 많은 페이지들이 사용자가 인식하지 못하는 사이에 보이지 않게 리다이렉션을 수행한다. followRedirect
와 maxRedirects
파라미터는 3xx HTTP 리다이렉션을 최대 10개까지 처리하라고 request
에게 알려준다. 또한, request()
는 여기에서 보여주지 않은 다른 많은 파라미터들을 지원한다.
앞에서 언급했듯이 request
는 GET
요청뿐만 아니라 더 많은 것을 지원한다. 아주 일반적인것 중 하나가 POST
요청을 사용하여 폼 데이터를 제출하는 것이다. 다음 예제는 POST
의 한 부분으로 사용자의 이름을 전송하기 위해서 request()
의 form
파라미터를 사용한다. 그러면 PHP 페이지가 사용자에게 응답을 하는데 전송한 이름으로 인사 메시지를 보여줄 것이다.
var request = require("request");
request({
uri: "http://www.cjihrig.com/development/php/hello_form.php",
method: "POST",
form: {
name: "Bob"
}
}, function(error, response, body) {
console.log(body);
});
많은 사이트들이 쿠키를 사용해서 사용자와의 다양한 상호작용을 추적한다. 쿠키는 모든 HTTP 전송간에 클라이언트와 서버 사이에서 왔다 갔다 전송되는 작은 데이터 조각들이다. 쿠키의 사용을 용이하게 하기 위해서 request
는 jar()
와 cookie()
메서드를 제공한다. 다음 예제의 3 라인을 보면 사용자의 이름을 명시한 쿠키를 생성했다. 그 다음 2 라인에서 생성한 cookie jar에 그 쿠키를 추가했다. HTTP 요청을 만들때 jar
파라미터는 서버에 cookie jar를 전송하기 위해 사용된다.
var request = require("request");
var jar = request.jar();
var cookie = request.cookie("name=John");
jar.add(cookie);
request({
uri: "http://www.cjihrig.com/development/php/hello_cookies.php",
method: "GET",
jar: jar
}, function(error, response, body) {
console.log(body);
});
응답을 받게 될 때 사용자는 쿠키에 저장되어 있던 이름인 John으로 인사 메시지를 받을 것이다. cookie jar는 또한 서버에 의한 어떤 변화에도 업데이트가 된다. 요청을 보내기 전과 후에 cookie jar를 출력해 보면, 서버가 쿠키의 값을 “John”
에서 “Stranger”
로 변경한 것을 알 수 있다. 사이트와 사용자간에 실제 상호작용을 묘사하기 위해서 같은 cookie jar를 HTTP 요청에 연속으로 보낼수 있다.
이번 글에서는 간단하지만 강력한 request
모듈에 대해서 소개를 했다. 이번 글이 포괄적이지는 않기 때문에 request
가 할 수 있는 다른 것들을 알아보기 위해서는 최소한의 문서들을 검색해봐야 할 것이다. 곧 나올 글에서 request
를 더 심도있게 사용한 웹 스크래핑에 대해서 다룰 계획이니 계속 지켜봐 주길 바란다.